//
// Created by LiuYou on 2021/10/12.
//

#include <iostream>
#include <unistd.h>
#include "Counter.hpp"


class ThreadArgs {
public:
    ThreadArgs(MutexLock& mutexLock, Counter& counter) : mutexLock( mutexLock ), counter( counter ) {}

    ~ThreadArgs() = default;

public:
    /**
     * @details 这里使用互斥锁的原因是 在线程 aThread 中使用到了 std::cout,
     * std::cout 不是线程安全的。所以使用它的时候需要加锁保护。
     *
     * <pre>这个互斥锁并不是为了保护 counter, counter本身就是线程安全的。
     */
    MutexLock& mutexLock;
    Counter& counter;
};


static void* aThread(void* args) {
    ThreadArgs* threadArgs = static_cast<ThreadArgs*>(args);
//    MutexLockGuard mutexLockGuard( threadArgs->mutexLock );
//    threadArgs->counter.getAndIncrease();
//    std::cout << "执行线程[ " << pthread_self() << " ]。" << std::endl;
//    std::cout << threadArgs->counter << std::endl;

//    printf( "%ld\n", threadArgs->counter.getAndIncrease());

    // 因为 counter是线程安全的所以执行这个方法是不会有问题的。
    threadArgs->counter.getAndIncrease();

    Counter aCounter;


    pthread_exit( nullptr );
}


int main(int argc, char** argv) {
    Counter aCounter;
    MutexLock mutexLock;

    ThreadArgs threadArgs( mutexLock, aCounter );

    pthread_t tid[100];

    for (int i = 0; i < 100; ++i) {
        pthread_create( tid + i, nullptr, aThread, &threadArgs );
    }

    sleep( 1 );

    // todo 笔记: 竟然是这里的问题！！！！！？？？？？
    //  元素是 pthread_t 类型, 而不是 int 类型。注意！
    for (pthread_t i: tid) {
        pthread_join( i, nullptr );
    }

    std::cout << aCounter << std::endl;

    return 0;
}
